#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}




/**
 * @brief 初始化全局环形缓冲区
 *
 * @param buf 平台环形缓冲区数组
 */
void buffer_init(struct buffer *buf)
{
    pthread_mutex_init(&buf->mutex, NULL);
    pthread_cond_init(&buf->not_empty, NULL);//初始化条件变量
    pthread_cond_init(&buf->not_full, NULL);
    buf->read_pos = buf->write_pos = buf->size = 0;
}


/**
 * @brief 将帧放入到环形缓冲区中
 *
 * @param g_buf 平台环形缓冲区数组
 * @param frame 平台帧结构体指针
 */
void buffer_put(struct buffer * g_buf, Frame_DATA_p frame)
{
    pthread_mutex_lock(&g_buf->mutex);
    //当传入的数组最满时，进程阻塞等待不满的信号
    while (g_buf->size == BUFFER_SIZE)
    {
        pthread_cond_wait(&g_buf->not_full, &g_buf->mutex);
    }

    //将value写入到数组当前写入的位置中
    g_buf->Frame_DATA[g_buf->write_pos] = *frame;
    //令当前位置加一
    g_buf->write_pos = (g_buf->write_pos + 1) % BUFFER_SIZE;
    //已写的长度加一
    g_buf->size++;

    //上述执行完毕，表示此数组不是空的，发送信号
    pthread_cond_signal(&g_buf->not_empty);
    pthread_mutex_unlock(&g_buf->mutex);
}


/**
 * @brief 获取环形缓冲区的一个帧
 *
 * @param g_buf         平台环形缓冲区数组
 * @return Frame_DATA_p 平台帧结构体指针
 */
Frame_DATA_p buffer_get(struct buffer *g_buf)
 {
    pthread_mutex_lock(&g_buf->mutex);

    //当传入的数组没有数据时，等待不是空的信号
    while (g_buf->size == 0)
    {
        pthread_cond_wait(&g_buf->not_empty, &g_buf->mutex);
    }

    //将此时正在读的位置的值读出
    Frame_DATA_p value = &g_buf->Frame_DATA[g_buf->read_pos];
    //此时读的位置加一
    g_buf->read_pos = (g_buf->read_pos + 1) % BUFFER_SIZE;
    //读取到数据后，整体数据减小
    g_buf->size--;
    //上述执行完毕，表示此数组不是满的，发送信号
    pthread_cond_signal(&g_buf->not_full);
    pthread_mutex_unlock(&g_buf->mutex);
    return value;
}






/**
 * @brief 回收环形缓冲区
 *
 * @param g_buf 平台环形缓冲区数组
 */
void pthread_destroy(struct buffer *g_buf)
{

    pthread_mutex_destroy(&g_buf->mutex);
    pthread_cond_destroy(&g_buf->not_empty);
    pthread_cond_destroy(&g_buf->not_full);


}












